package QianFeng09.ThreadDemo;
/**
 * 线程的基本使用：
 * 线程实现的两种方式
 * 在Java中如果要想实现多线程的操作，有两种实现方法:
 * (1)一种是继承Thread类
 * class MyThread extends Thread{
 *     public void run(){
 *     //逻辑处理
 *     }
 *     MyThread mt = new MyThread();
 *     mt.start();
 * }
 * (2)另外一种是实现Runnable接口
 * class MyRunnable implements Runnable{
 *     public void run(){
 *     //逻辑处理
 *     }
 *     MyRunnable mr = new MyRunnable();
 *     Thread t= new Thread(mr);
 *     t.start();
 * }
 *
 * 线程的休眠：
 * public static void sleep(long millis) throws InterruptedException
 * 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行) ,释放CPU的时间片，
 * 具体取决于系统定时器和调度程序的精度和准确性。线程不会丢失任何显示器的所有权。
 * 参数
 * millis -以毫秒为单位的睡眠时间长度
 * 异常
 * IllegalArgumentException-如果millis值为负数
 * InterruptedException-如果任何线程中断当前线程。当抛出此异常时，当前线程的中断状态将被清除。
 * public static void sleep(long millis,int nanos) throws InterruptedException毫秒，纳秒
 * static Thread currentThread()返回对当前正在执行的线程对象的引用。
 **/
public class ThreadDemo1 {
    public static void main(String[] args) {
        /*两线程并发执行*/
        //方法一
        MyThread mt = new MyThread();
        mt.start();//启动线程
        //方法二
        MyRunnable mr = new MyRunnable();//一个任务，建议使用方法二使用线程
        Thread rt = new Thread(mr);
        rt.start();

    }

}

//实现线程的第一种方法：继承Thread类
class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + "-" + i);
            //休眠
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}

//实现线程的第二种方法：继承Runnable接口
class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + "-" + i);
            //休眠
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

